public class TestDemo {

//    解法：https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/solutions/539634/zhe-ke-neng-shi-quan-wang-zui-xi-de-kmp-8zl57/?languageTags=java
//    28. 找出字符串中第一个匹配项的下标
//    朴素解法BF算法（Brute Force）

    public static void main1(String[] args) {
        String str = "ABCABCAABCABCD";
        String patten = "ABCABCD";
        System.out.println(search(str,patten));//7
    }
    public static int search(String str, String patten){
        int n = str.length();//原字符串的长度
        int m = patten.length();//模式字符串的长度
//        转为字符数组
        char[] str1 = str.toCharArray();
        char[] patten1 = patten.toCharArray();

//        判断后的长度不能比 模式字符串短 所以n-m
        for (int i = 0; i <= n - m; i++) {
            int a = i;
            int b = 0;
            while (b < m && str1[a] == patten1[b]) {
                a++;
                b++;
            }
            if (b == m) {
                return i;
            }
        }
        return -1;
    }





//    BM算法(Boyer-Moore)     从右往左进行比较
//    坏字符规则 和 好后缀规则 结合使用



//    坏字符
//      有三种移动情况，分别是下方的模式串中没有发现与坏字符对应的字符，
//      发现一个对应字符，发现两个（选择第二个）。
//    好后缀
//      1.如果模式串含有好后缀，无论是中间还是头部可以按照规则进行移动。如果好后缀在模式串中出现多次，则以最右侧的好后缀为基准。
//      2.如果模式串头部含有好后缀子串则可以按照规则进行移动，中间部分含有好后缀子串则不可以。
//      3.如果在模式串尾部就出现不匹配的情况，即不存在好后缀时，则根据坏字符进行移动，这里有的文章没有提到，是个需要特别注意的地方，我是在这个论文里找到答案的，感兴趣的同学可以看下







}
